package com.liuqi.knet.remoting;

import com.liuqi.knet.remoting.exchange.ResponseFuture;
import java.net.InetSocketAddress;

/**
 * 客户端或服务端的连接通道
 *
 * @author liuqi
 * @date 2024/12/17 15:42
 **/
public interface Channel extends Endpoint {

    /**
     * attr key 建立连接时间
     */
    String connectTimestampKey = "connect_timestamp";

    /**
     * 获取远程连接地址
     *
     * @return
     */
    InetSocketAddress getRemoteAddress();

    /**
     * 通道是否活跃的
     *
     * @return
     */
    boolean isActive();

    /**
     * 发送消息, 并返回一个Future, 通过此Future获取响应内容, 超时时间
     *
     * @param request   {@link com.liuqi.knet.remoting.exchange.Request}, 如果不是该类型, 将自动转换成 Request
     * @return
     * @throws RemotingException
     */
    ResponseFuture request(Object request) throws RemotingException;

    /**
     * 发送消息, 并返回一个Future, 通过此Future获取响应内容, 超时时间<code>timeout</code>
     *
     * @param request    {@link com.liuqi.knet.remoting.exchange.Request}, 如果不是该类型, 将自动转换成 Request
     * @param timeout   获取响应超时时间, 单位毫秒
     * @return
     * @throws RemotingException
     */
    ResponseFuture request(Object request, int timeout) throws RemotingException;

    // ==========  通道属性操作

    boolean hasAttribute(String key);

    Object getAttribute(String key);

    void setAttribute(String key, Object value);

    void removeAttribute(String key);

}
